package pruebas;

import modelo.Tablero;
import modelo.Posicion;
import modelo.Norte;
import modelo.Oeste;
import modelo.Este;
import modelo.Noroeste;
import modelo.Barco;
import modelo.Lancha;
import modelo.Buque;
import modelo.Destructor;
import modelo.Portaaviones;
import modelo.RompeHielos;
import modelo.Mina;
import modelo.Disparo;
import modelo.MinaSubmarinaPuntualConRetardo;
import modelo.MinaSubmarinaDobleConRetardo;
import modelo.MinaSubmarinaTripleConRetardo;
import modelo.MinaSubmarinaPorContacto;

import excepciones.CantidadDePosicionesIncorrectasExcepcion;
import excepciones.LaPosicionYaTieneMinaExcepcion;
import excepciones.TableroIndiceFueraDeRangoExcepcion;

import java.util.List;
import java.util.ArrayList;

import junit.framework.TestCase;
import org.junit.Test;
public class MinaTest extends TestCase {

	// Test positivos.
	@Test
	public void testUnDisparoPoseeUnCostoDe200Puntos() {
		Posicion posicion = new Posicion(1, 2);
		Mina disparo = new Disparo();
		try {
			disparo.ponerPosicion(posicion);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		assertTrue(disparo.getPuntos() == 200);
	}
	
	@Test
	public void testAgregoUnaMinaYluegoOtra(){
		
		Tablero tablero=new Tablero();
		Posicion posicion=null;
		Mina minaTriple=new MinaSubmarinaTripleConRetardo();
		
		try{
			posicion=tablero.getPosicion(1,2);
		}catch (TableroIndiceFueraDeRangoExcepcion e){}
		
		try {
			minaTriple.ponerPosicion(posicion);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		minaTriple.explotar(tablero);
		
		assertTrue(posicion.getMina()==null);
		assertTrue(minaTriple.getPosicion().getMina()==null);
		try{
			assertTrue(tablero.getPosicion(1,2).getMina()==null);
		}catch (TableroIndiceFueraDeRangoExcepcion e){}
		
		
		Mina minaDoble2=new MinaSubmarinaDobleConRetardo();
		try {
			minaDoble2.ponerPosicion(posicion);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		assertTrue(posicion.getMina()==minaDoble2);
		
	}
	
	
	@Test
	public void testUnaMinaSubmarinaDobleConRetardoPoseeUnCostoDe100Puntos() {
		Posicion posicion = new Posicion(2, 3);
		Mina minaSubmarinaDobleConRetardo = new MinaSubmarinaDobleConRetardo();
		try {
			minaSubmarinaDobleConRetardo.ponerPosicion(posicion);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		assertTrue(minaSubmarinaDobleConRetardo.getPuntos() == 100);	
	}
	
	@Test
	public void testUnaMinaSubmarinaPuntualConRetardoPoseeUnCostoDe50Puntos() {
		Posicion posicion = new Posicion(3, 4);
		Mina minaSubmarinaPuntualConRetardo = new MinaSubmarinaPuntualConRetardo();
		try {
			minaSubmarinaPuntualConRetardo.ponerPosicion(posicion);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		assertTrue(minaSubmarinaPuntualConRetardo.getPuntos() == 50);
	}
	
	@Test
	public void testUnaMinaSubmarinaTripleConRetardoPoseeUnCostoDe125Puntos() {
		Posicion posicion = new Posicion(3, 5);
		Mina minaSubmarinaTripleConRetardo = new MinaSubmarinaTripleConRetardo();
		try {
			minaSubmarinaTripleConRetardo.ponerPosicion(posicion);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		assertTrue(minaSubmarinaTripleConRetardo.getPuntos() == 125);
	}
	
	@Test
	public void testUnDisparoDaniaUnaParteDeUnaLancha() {
		Tablero tablero = new Tablero();
		ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
		List<Posicion> posicionesRotas;
		List<Posicion> posicionesSanas;
		
		Posicion posA = null;
		Posicion posB = null;
		try {
			posA = tablero.getPosicion(1, 1);
			posB = tablero.getPosicion(1, 2);
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError) {
			unError.printStackTrace();
		}
		
    	Mina disparo = new Disparo();
    	try {
			disparo.ponerPosicion(posA);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	posiciones.add(posA);
    	posiciones.add(posB);
    	    
    	Barco lancha = null;
		try {
			lancha = new Lancha(posiciones, new Oeste());
    	}
		catch (CantidadDePosicionesIncorrectasExcepcion unError) {
			unError.printStackTrace();
		}
    	
		disparo.explotar(tablero);
		posicionesRotas = lancha.getPosicionesRotas();
		posicionesSanas = lancha.getPosicionesSanas();
		
		assertSame(posA, posicionesRotas.get(0));
		assertTrue(posicionesSanas.size() == 1);
	}

	@Test
	public void testMinaDobleDestruyePartesPortaaviones(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try {
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
			posiciones.add(tablero.getPosicion(1, 4));
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError) {
			unError.printStackTrace();
		}
		
		try {
			Barco barco = new Portaaviones(posiciones, new Oeste());
			Mina mina = new MinaSubmarinaDobleConRetardo();
		
			try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
			assertTrue(barco.getPosicionesRotas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna() == 0);
			assertTrue(barco.getPosicionesRotas().get(1).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(1).getColumna() == 1);
			assertTrue(barco.getPosicionesRotas().get(2).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(2).getColumna() == 2);
			assertTrue(barco.getPosicionesSanas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna() == 3);
			assertTrue(barco.getPosicionesSanas().get(1).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(1).getColumna() == 4);
		
		}
		catch (CantidadDePosicionesIncorrectasExcepcion unError){
			unError.printStackTrace();
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError) {
			unError.printStackTrace();
		}
	}

	@Test
	public void testMinaPuntualDestruyePartePortaaviones(){
		Tablero tablero = new Tablero();
		ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
		try {
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
			posiciones.add(tablero.getPosicion(1, 4));
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
			unError.printStackTrace();
		}
		try {
			Barco barco = new Portaaviones(posiciones, new Oeste());
			Mina mina = new MinaSubmarinaPuntualConRetardo();
			
			try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
			assertTrue(barco.getPosicionesRotas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna() == 0);
			assertTrue(barco.getPosicionesSanas().get(1).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(1).getColumna() == 2);
			assertTrue(barco.getPosicionesSanas().get(2).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(2).getColumna() == 3);
			assertTrue(barco.getPosicionesSanas().get(3).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(3).getColumna() == 4);
		}
		catch (CantidadDePosicionesIncorrectasExcepcion unError) {
			unError.printStackTrace();
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError) {
			unError.printStackTrace();
		}
	}
	
	@Test
	public void testDisparoDestruyePartePortaaviones(){
		Tablero tablero = new Tablero();
		ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
		try {
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
			posiciones.add(tablero.getPosicion(1, 4));
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
			unError.printStackTrace();
		}
		try {
			Barco barco = new Portaaviones(posiciones, new Oeste());
			Mina mina = new Disparo();
			
			try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
			assertTrue(barco.getPosicionesRotas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna() == 0);
			assertTrue(barco.getPosicionesSanas().get(1).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(1).getColumna() == 2);
			assertTrue(barco.getPosicionesSanas().get(2).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(2).getColumna() == 3);
			assertTrue(barco.getPosicionesSanas().get(3).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(3).getColumna() == 4);
		}
		catch (CantidadDePosicionesIncorrectasExcepcion unError) {
			unError.printStackTrace();
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError) {
			unError.printStackTrace();
		}
	}
	
	@Test
	public void testMinaTripleDestruyePartePortaaviones(){
		Tablero tablero = new Tablero();
		ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
		try {
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
			posiciones.add(tablero.getPosicion(1, 4));
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
			unError.printStackTrace();
		}
		try {
			Barco barco = new Portaaviones(posiciones, new Oeste());
			Mina mina = new MinaSubmarinaTripleConRetardo();
		
			try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
			assertTrue(barco.getPosicionesRotas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna() == 0);
			assertTrue(barco.getPosicionesRotas().get(1).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(1).getColumna() == 1);
			assertTrue(barco.getPosicionesRotas().get(2).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(2).getColumna() == 2);
			assertTrue(barco.getPosicionesRotas().get(3).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(3).getColumna() == 3);
			assertTrue(barco.getPosicionesSanas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna() == 4);
		}
		catch (CantidadDePosicionesIncorrectasExcepcion unError){
			unError.printStackTrace();
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
			unError.printStackTrace();
		}
	}
	
	@Test
	public void testMinaContactoDestruyaPartePortaaviones(){
		Tablero tablero = new Tablero();
		ArrayList<Posicion> posiciones = new ArrayList<Posicion>();
		try {
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
			posiciones.add(tablero.getPosicion(1, 4));
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
			unError.printStackTrace();
		}
		try {
			Barco barco = new Portaaviones(posiciones, new Oeste());
			Mina mina = new MinaSubmarinaPorContacto();
		
			try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
			assertTrue(barco.getPosicionesRotas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna() == 0);
			assertTrue(barco.getPosicionesSanas().get(1).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(1).getColumna() == 2);
			assertTrue(barco.getPosicionesSanas().get(2).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(2).getColumna() == 3);
			assertTrue(barco.getPosicionesSanas().get(3).getFila() == 1);
			assertTrue(barco.getPosicionesSanas().get(3).getColumna() == 4);
		}
		catch (CantidadDePosicionesIncorrectasExcepcion unError) {
			unError.printStackTrace();
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError) {
			unError.printStackTrace();
		}
	}
	// Aca
	@Test
	public void testMinaContactoNoDestruyaParteDestructor(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
		
		try{
			Barco barco=new Destructor(posiciones,new Oeste());
		Mina mina=new MinaSubmarinaPorContacto();
		try {
			mina.ponerPosicion(tablero.getPosicion(1,1));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
	
		assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
		assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
		assertTrue(barco.getPosicionesSanas().get(1).getFila()==1);
		assertTrue(barco.getPosicionesSanas().get(1).getColumna()==1);
		assertTrue(barco.getPosicionesSanas().get(2).getFila()==1);
		assertTrue(barco.getPosicionesSanas().get(2).getColumna()==2);
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testDisparoDestruyaParteDestructor(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
		
		try{
			Barco barco=new Destructor(posiciones,new Oeste());
		Mina mina=new Disparo();
		try {
			mina.ponerPosicion(tablero.getPosicion(1,1));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
	
		assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
		assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
		assertTrue(barco.getPosicionesRotas().get(0).getFila()==1);
		assertTrue(barco.getPosicionesRotas().get(0).getColumna()==1);
		assertTrue(barco.getPosicionesSanas().get(1).getFila()==1);
		assertTrue(barco.getPosicionesSanas().get(1).getColumna()==2);
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaContactoDestruyaBuque(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
		
		try{
			Barco barco=new Buque(posiciones,new Oeste());
		Mina mina=new MinaSubmarinaPorContacto();
		try {
			mina.ponerPosicion(tablero.getPosicion(1,1));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco.estaDestruido());
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	@Test
	public void testMinaTripleDestruyaBuque(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
		
		try{
			Barco barco=new Buque(posiciones,new Oeste());
		Mina mina=new MinaSubmarinaTripleConRetardo();
		try {
			mina.ponerPosicion(tablero.getPosicion(1,1));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco.estaDestruido());
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaDobleDestruyaBuque(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
		
		try{
			Barco barco=new Buque(posiciones,new Oeste());
		Mina mina=new MinaSubmarinaDobleConRetardo();
		try {
			mina.ponerPosicion(tablero.getPosicion(1,1));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco.estaDestruido());
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaPuntualDestruyaBuque(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
		
		try{
			Barco barco=new Buque(posiciones,new Oeste());
		Mina mina=new MinaSubmarinaPuntualConRetardo();
		try {
			mina.ponerPosicion(tablero.getPosicion(1,1));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco.estaDestruido());
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testDisparoDestruyaBuque(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
			posiciones.add(tablero.getPosicion(1, 3));
		
		try{
			Barco barco=new Buque(posiciones,new Oeste());
		Mina mina=new Disparo();
		try {
			mina.ponerPosicion(tablero.getPosicion(1,1));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco.estaDestruido());
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testDisparoDestruyaParteLancha(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));

		
		try{
			Barco barco=new Lancha(posiciones,new Oeste());
			Mina mina=new Disparo();
			try {
				mina.ponerPosicion(tablero.getPosicion(1,1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
	
			assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
			assertTrue(barco.getPosicionesRotas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna()==1);

		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaPuntualDestruyaParteLancha(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));

		
		try{
			Barco barco=new Lancha(posiciones,new Oeste());
			Mina mina=new MinaSubmarinaPuntualConRetardo();
			try {
				mina.ponerPosicion(tablero.getPosicion(1,1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
	
			assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
			assertTrue(barco.getPosicionesRotas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna()==1);
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}

	@Test
	public void testMinaDobleDestruyaLancha(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));

		
		try{
			Barco barco=new Lancha(posiciones,new Oeste());
			Mina mina=new MinaSubmarinaDobleConRetardo();
			try {
				mina.ponerPosicion(tablero.getPosicion(1,1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
			mina.explotar(tablero);
		
			assertTrue(barco.estaDestruido());

		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaTripleDestruyaLancha(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));

		
		try{
			Barco barco=new Lancha(posiciones,new Oeste());
			Mina mina=new MinaSubmarinaTripleConRetardo();
			try {
				mina.ponerPosicion(tablero.getPosicion(1,1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
			assertTrue(barco.estaDestruido());

		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaContactoDestruyaParteLancha(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));

		
		try{
			Barco barco=new Lancha(posiciones,new Oeste());
			Mina mina=new MinaSubmarinaPuntualConRetardo();
			try {
				mina.ponerPosicion(tablero.getPosicion(1,1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina.explotar(tablero);
		
	
			assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
			assertTrue(barco.getPosicionesRotas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna()==1);

		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testDisparoTocaDosvecesParteRompehielos(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(1, 0));
			posiciones.add(tablero.getPosicion(1, 1));
			posiciones.add(tablero.getPosicion(1, 2));
		
		try{
			Barco barco=new RompeHielos(posiciones,new Oeste());
			Mina mina=new Disparo();
			try {
				mina.ponerPosicion(tablero.getPosicion(1,1));
			} catch (LaPosicionYaTieneMinaExcepcion e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			mina.explotar(tablero);
			
			Mina mina2=new Disparo();
			try {
				mina2.ponerPosicion(tablero.getPosicion(1,1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mina2.explotar(tablero);
		
			assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
			assertTrue(barco.getPosicionesRotas().get(0).getFila()==1);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna()==1);
			assertTrue(barco.getPosicionesSanas().get(1).getFila()==1);
			assertTrue(barco.getPosicionesSanas().get(1).getColumna()==2);
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}

	@Test
	public void testDosMinasExplotanDanianYRompenPartesDeRompehielos(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(0, 0));
			posiciones.add(tablero.getPosicion(0, 1));
			posiciones.add(tablero.getPosicion(0, 2));
		
		try{
			Barco barco=new RompeHielos(posiciones,new Oeste());
			Mina mina=new MinaSubmarinaDobleConRetardo();
			try {
				mina.ponerPosicion(tablero.getPosicion(0,0));
			} catch (LaPosicionYaTieneMinaExcepcion e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			Mina mina2=new MinaSubmarinaTripleConRetardo();
			try {
				mina2.ponerPosicion(tablero.getPosicion(1,0));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
			mina.explotar(tablero);
			mina2.explotar(tablero);
		
			assertTrue(barco.getPosicionesRotas().get(0).getFila()==0);
			assertTrue(barco.getPosicionesRotas().get(0).getColumna()==0);
			assertTrue(barco.getPosicionesRotas().get(1).getFila()==0);
			assertTrue(barco.getPosicionesRotas().get(1).getColumna()==1);
			assertTrue(3-barco.getPosicionesSanas().size()-barco.getPosicionesRotas().size()==1);//cantidad de posiciones daniadas
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test 
	public void testDosMinasDestruyenRompeHielos(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(4,3));
			posiciones.add(tablero.getPosicion(5,3));
			posiciones.add(tablero.getPosicion(6,3));
		
		try{
			Barco barco=new RompeHielos(posiciones,new Oeste());
			Mina mina=new MinaSubmarinaTripleConRetardo();
			try {
				mina.ponerPosicion(tablero.getPosicion(4,3));
			} catch (LaPosicionYaTieneMinaExcepcion e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			Mina mina2=new MinaSubmarinaTripleConRetardo();
			try {
				mina2.ponerPosicion(tablero.getPosicion(5,3));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
			mina.explotar(tablero);
			mina2.explotar(tablero);
		
			assertTrue(barco.estaDestruido());
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
		
	@Test
	public void testVariosBarcosEnRangoDeMinaTriple(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones1=new ArrayList<Posicion>();
		ArrayList<Posicion> posiciones2=new ArrayList<Posicion>();
		ArrayList<Posicion> posiciones3=new ArrayList<Posicion>();
		ArrayList<Posicion> posiciones4=new ArrayList<Posicion>();
		ArrayList<Posicion> posiciones5=new ArrayList<Posicion>();
		ArrayList<Posicion> posiciones6=new ArrayList<Posicion>();
		ArrayList<Posicion> posiciones7=new ArrayList<Posicion>();
		try{
			posiciones1.add(tablero.getPosicion(2, 6));
			posiciones1.add(tablero.getPosicion(3, 6));
			posiciones1.add(tablero.getPosicion(4, 6));
			posiciones1.add(tablero.getPosicion(5, 6));
			posiciones1.add(tablero.getPosicion(6, 6));
			posiciones2.add(tablero.getPosicion(2, 5));
			posiciones2.add(tablero.getPosicion(3, 5));
			posiciones3.add(tablero.getPosicion(3, 5));
			posiciones3.add(tablero.getPosicion(3, 6));
			posiciones4.add(tablero.getPosicion(4, 3));
			posiciones4.add(tablero.getPosicion(5, 3));
			posiciones4.add(tablero.getPosicion(6, 3));
			posiciones5.add(tablero.getPosicion(4, 4));
			posiciones5.add(tablero.getPosicion(5, 4));
			posiciones5.add(tablero.getPosicion(6, 4));
			posiciones6.add(tablero.getPosicion(2, 2));
			posiciones6.add(tablero.getPosicion(2, 3));
			posiciones6.add(tablero.getPosicion(2, 4));
			posiciones7.add(tablero.getPosicion(5, 6));
			posiciones7.add(tablero.getPosicion(5, 7));
			posiciones7.add(tablero.getPosicion(5, 8));
			posiciones7.add(tablero.getPosicion(5, 9));
		
		try{
			Barco barco1=new Portaaviones(posiciones1,new Este());
			Barco barco2=new Lancha(posiciones2,new Norte());
			Barco barco3=new Lancha(posiciones3,new Noroeste());
			Barco barco4=new Destructor(posiciones4,new Noroeste());
			Barco barco5=new Destructor(posiciones5,new Noroeste());
			Barco barco6=new RompeHielos(posiciones6,new Norte());
			Barco barco7=new Buque(posiciones7,new Norte());
			
		Mina mina=new MinaSubmarinaTripleConRetardo();
		try {
			mina.ponerPosicion(tablero.getPosicion(4,4));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco1.estaDestruido());
		assertTrue(barco2.estaDestruido());
		assertTrue(barco3.estaDestruido());
		assertTrue(barco4.estaDestruido()==false);//son ambos destructores
		assertTrue(barco5.estaDestruido()==false);//solo le hacen da�o los disparos
		
		assertTrue(barco6.estaDestruido()==false);//es un rompehielos resiste 2 ataques
		assertTrue(barco7.estaDestruido());
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaDobleEnEsquinaDestruyaPartesPortaaviones(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(9, 0));
			posiciones.add(tablero.getPosicion(8, 1));
			posiciones.add(tablero.getPosicion(7, 2));
			posiciones.add(tablero.getPosicion(6, 3));
			posiciones.add(tablero.getPosicion(5, 4));
		
		try{
			Barco barco=new Portaaviones(posiciones,new Oeste());
		Mina mina=new MinaSubmarinaDobleConRetardo();
		try {
			mina.ponerPosicion(tablero.getPosicion(9,0));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco.getPosicionesRotas().get(0).getFila()==9);
		assertTrue(barco.getPosicionesRotas().get(0).getColumna()==0);
		assertTrue(barco.getPosicionesRotas().get(1).getFila()==8);
		assertTrue(barco.getPosicionesRotas().get(1).getColumna()==1);
		assertTrue(barco.getPosicionesSanas().get(0).getFila()==7);
		assertTrue(barco.getPosicionesSanas().get(0).getColumna()==2);
		assertTrue(barco.getPosicionesSanas().get(1).getFila()==6);
		assertTrue(barco.getPosicionesSanas().get(1).getColumna()==3);
		assertTrue(barco.getPosicionesSanas().get(2).getFila()==5);
		assertTrue(barco.getPosicionesSanas().get(2).getColumna()==4);
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	@Test
	public void testMinaTripleEnBordeDestruyaPartesPortaaviones(){
		Tablero tablero=new Tablero();
		ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
		try{
			posiciones.add(tablero.getPosicion(4, 0));
			posiciones.add(tablero.getPosicion(4, 1));
			posiciones.add(tablero.getPosicion(4, 2));
			posiciones.add(tablero.getPosicion(4, 3));
			posiciones.add(tablero.getPosicion(4, 4));
		
		try{
			Barco barco=new Portaaviones(posiciones,new Oeste());
		Mina mina=new MinaSubmarinaTripleConRetardo();
		try {
			mina.ponerPosicion(tablero.getPosicion(4,0));
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		mina.explotar(tablero);
		
		assertTrue(barco.getPosicionesRotas().get(0).getFila()==4);
		assertTrue(barco.getPosicionesRotas().get(0).getColumna()==0);
		assertTrue(barco.getPosicionesRotas().get(1).getFila()==4);
		assertTrue(barco.getPosicionesRotas().get(1).getColumna()==1);
		assertTrue(barco.getPosicionesRotas().get(2).getFila()==4);
		assertTrue(barco.getPosicionesRotas().get(2).getColumna()==2);
		assertTrue(barco.getPosicionesSanas().get(0).getFila()==4);
		assertTrue(barco.getPosicionesSanas().get(0).getColumna()==3);
		assertTrue(barco.getPosicionesSanas().get(1).getFila()==4);
		assertTrue(barco.getPosicionesSanas().get(1).getColumna()==4);
		
		}catch (CantidadDePosicionesIncorrectasExcepcion unError){
			
		}
		
		}
		catch (TableroIndiceFueraDeRangoExcepcion unError){
		
		}
	}
	
	// Test negativos.
    @Test
    public void testMinaPuntualNoDestruyaParteDestructor(){
            Tablero tablero=new Tablero();
            ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
            try{
                    posiciones.add(tablero.getPosicion(1, 0));
                    posiciones.add(tablero.getPosicion(1, 1));
                    posiciones.add(tablero.getPosicion(1, 2));
           
            try{
                    Barco barco=new Destructor(posiciones,new Oeste());
            Mina mina=new MinaSubmarinaPuntualConRetardo();
            try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            mina.explotar(tablero);
           
   
            assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
            assertTrue(barco.getPosicionesSanas().get(1).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(1).getColumna()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getColumna()==2);
           
            }catch (CantidadDePosicionesIncorrectasExcepcion unError){
                   
            }
           
            }
            catch (TableroIndiceFueraDeRangoExcepcion unError){
           
            }
    }
   
    @Test
    public void testMinaDobleNoDestruyaParteDestructor() {
            Tablero tablero=new Tablero();
            ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
            try{
                    posiciones.add(tablero.getPosicion(1, 0));
                    posiciones.add(tablero.getPosicion(1, 1));
                    posiciones.add(tablero.getPosicion(1, 2));
           
            try{
                    Barco barco=new Destructor(posiciones,new Oeste());
            Mina mina=new MinaSubmarinaDobleConRetardo();
            try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            mina.explotar(tablero);
           
   
            assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
            assertTrue(barco.getPosicionesSanas().get(1).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(1).getColumna()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getColumna()==2);
           
            }catch (CantidadDePosicionesIncorrectasExcepcion unError){
                   
            }
           
            }
            catch (TableroIndiceFueraDeRangoExcepcion unError){
           
            }
    }      
   
    @Test
    public void testMinaTripleNoDestruyaParteDestructor(){
            Tablero tablero=new Tablero();
            ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
            try{
                    posiciones.add(tablero.getPosicion(1, 0));
                    posiciones.add(tablero.getPosicion(1, 1));
                    posiciones.add(tablero.getPosicion(1, 2));
           
            try{
                    Barco barco=new Destructor(posiciones,new Oeste());
            Mina mina=new MinaSubmarinaTripleConRetardo();
            try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            mina.explotar(tablero);
           
   
            assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
            assertTrue(barco.getPosicionesSanas().get(1).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(1).getColumna()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getColumna()==2);
           
            }catch (CantidadDePosicionesIncorrectasExcepcion unError){
                   
            }
           
            }
            catch (TableroIndiceFueraDeRangoExcepcion unError){
           
            }
    }

    @Test
    public void testMinaContactoNoDestruyeParteDestructor(){
        Tablero tablero=new Tablero();
        ArrayList<Posicion> posiciones=new ArrayList<Posicion>();
        try{
        	posiciones.add(tablero.getPosicion(1, 0));
        	posiciones.add(tablero.getPosicion(1, 1));
        	posiciones.add(tablero.getPosicion(1, 2));
        	
    	try{
                Barco barco=new Destructor(posiciones,new Oeste());
            Mina mina=new MinaSubmarinaPorContacto();
            try {
				mina.ponerPosicion(tablero.getPosicion(1, 1));
			} catch (LaPosicionYaTieneMinaExcepcion e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            mina.explotar(tablero);
           
   
            assertTrue(barco.getPosicionesSanas().get(0).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(0).getColumna()==0);
            assertTrue(barco.getPosicionesSanas().get(1).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(1).getColumna()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getFila()==1);
            assertTrue(barco.getPosicionesSanas().get(2).getColumna()==2);
           
            }catch (CantidadDePosicionesIncorrectasExcepcion unError){
                   
            }
           
            }
            catch (TableroIndiceFueraDeRangoExcepcion unError){
           
            }
    }
   
    @Test
    public void testUnSoloDisparoNoDestruyeParteDeRompehielos() {
        Tablero tablero = new Tablero();
        List<Posicion> posiciones = new ArrayList<Posicion>();
        List<Posicion> posicionesRotas;
       
        Posicion posA = null;
        Posicion posB = null;
        Posicion posC = null;
        try {
            posA = tablero.getPosicion(1, 1);
            posB = tablero.getPosicion(1, 2);
            posC = tablero.getPosicion(1, 3);
        }
        catch (TableroIndiceFueraDeRangoExcepcion unError) {
            unError.printStackTrace();
        }
           
	    Mina disparo = new Disparo();
	    try {
			disparo.ponerPosicion(posA);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	   
	    posiciones.add(posA);
	    posiciones.add(posB);
	    posiciones.add(posC);
	   
	    Barco rompehielos = null;
        try {
            rompehielos = new RompeHielos(posiciones, new Oeste());
	    }
        catch (CantidadDePosicionesIncorrectasExcepcion unError) {
            unError.printStackTrace();
        }
   
        disparo.explotar(tablero);
        posicionesRotas = rompehielos.getPosicionesRotas();
                           
        assertTrue(posicionesRotas.size() == 0);
    }

    @Test
    public void testUnaSolaMinaPuntualNoDestruyeParteDeRompehielos() {
        Tablero tablero = new Tablero();
        List<Posicion> posiciones = new ArrayList<Posicion>();
        List<Posicion> posicionesRotas;
       
        Posicion posA = null;
        Posicion posB = null;
        Posicion posC = null;
        try {
            posA = tablero.getPosicion(1, 1);
            posB = tablero.getPosicion(1, 2);
            posC = tablero.getPosicion(1, 3);
        }
        catch (TableroIndiceFueraDeRangoExcepcion unError) {
            unError.printStackTrace();
        }
           
	    Mina minaPuntual = new MinaSubmarinaPuntualConRetardo();
	    try {
			minaPuntual.ponerPosicion(posA);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	   
	    posiciones.add(posA);
	    posiciones.add(posB);
	    posiciones.add(posC);
	   
	    Barco rompehielos = null;
        try {
        	rompehielos = new RompeHielos(posiciones, new Oeste());
        }
        catch (CantidadDePosicionesIncorrectasExcepcion unError) {
        	unError.printStackTrace();
        }
   
        minaPuntual.explotar(tablero);
        posicionesRotas = rompehielos.getPosicionesRotas();
                       
        assertTrue(posicionesRotas.size() == 0);
    }
   
    @Test
    public void testUnaSolaMinaDobleNoDestruyeParteDeRompehielos() {
        Tablero tablero = new Tablero();
        List<Posicion> posiciones = new ArrayList<Posicion>();
        List<Posicion> posicionesRotas;
       
        Posicion posA = null;
        Posicion posB = null;
        Posicion posC = null;
        try {
            posA = tablero.getPosicion(1, 1);
            posB = tablero.getPosicion(1, 2);
            posC = tablero.getPosicion(1, 3);
        }
        catch (TableroIndiceFueraDeRangoExcepcion unError) {
            unError.printStackTrace();
        }
           
	    Mina minaDoble = new MinaSubmarinaDobleConRetardo();
	    try {
			minaDoble.ponerPosicion(posA);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	   
	    posiciones.add(posA);
	    posiciones.add(posB);
	    posiciones.add(posC);
	   
	    Barco rompehielos = null;
        try {
            rompehielos = new RompeHielos(posiciones, new Oeste());
	    }
        catch (CantidadDePosicionesIncorrectasExcepcion unError) {
            unError.printStackTrace();
        }
	   
        minaDoble.explotar(tablero);
        posicionesRotas = rompehielos.getPosicionesRotas();
	                           
        assertTrue(posicionesRotas.size() == 0);
    }

    @Test
    public void testUnaSolaMinaTripleNoDestruyeParteDeRompehielos() {
        Tablero tablero = new Tablero();
        List<Posicion> posiciones = new ArrayList<Posicion>();
        List<Posicion> posicionesRotas;
           
        Posicion posA = null;
        Posicion posB = null;
        Posicion posC = null;
        try {
            posA = tablero.getPosicion(1, 1);
            posB = tablero.getPosicion(1, 2);
            posC = tablero.getPosicion(1, 3);
        }
        catch (TableroIndiceFueraDeRangoExcepcion unError) {
            unError.printStackTrace();
        }
           
        Mina minaTriple = new MinaSubmarinaTripleConRetardo();
        try {
			minaTriple.ponerPosicion(posA);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
   
	    posiciones.add(posA);
	    posiciones.add(posB);
	    posiciones.add(posC);
	   
	    Barco rompehielos = null;
	    try {
	    	rompehielos = new RompeHielos(posiciones, new Oeste());
	    }
	    catch (CantidadDePosicionesIncorrectasExcepcion unError) {
            unError.printStackTrace();
        }
	   
	    minaTriple.explotar(tablero);
        posicionesRotas = rompehielos.getPosicionesRotas();
	                           
        assertTrue(posicionesRotas.size() == 0);
    }
   
    @Test
    public void testUnaSolaMinaPorContactoNoDestruyeParteDeRompehielos() {
    	Tablero tablero = new Tablero();
        List<Posicion> posiciones = new ArrayList<Posicion>();
        List<Posicion> posicionesRotas;
   
        Posicion posA = null;
        Posicion posB = null;
        Posicion posC = null;
        try {
            posA = tablero.getPosicion(1, 1);
            posB = tablero.getPosicion(1, 2);
            posC = tablero.getPosicion(1, 3);
        }
        catch (TableroIndiceFueraDeRangoExcepcion unError) {
                unError.printStackTrace();
        }
       
        Mina minaPorContacto = new MinaSubmarinaPorContacto();
        try {
			minaPorContacto.ponerPosicion(posA);
		} catch (LaPosicionYaTieneMinaExcepcion e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
   
        posiciones.add(posA);
        posiciones.add(posB);
        posiciones.add(posC);
   
        Barco rompehielos = null;
        try {
        	rompehielos = new RompeHielos(posiciones, new Oeste());
        }
        catch (CantidadDePosicionesIncorrectasExcepcion unError) {
        	unError.printStackTrace();
        }
   
        minaPorContacto.explotar(tablero);
        posicionesRotas = rompehielos.getPosicionesRotas();
                           
        assertTrue(posicionesRotas.size() == 0);
    }
}
